import { tmCv } from '..';
import { shapeStyle } from '../interface';
import { Shape } from '../shape';
interface roundRect extends shapeStyle {
  radius: [number, number, number, number];
}
export class tmRoundRect extends Shape {
  radius: [number, number, number, number] = [0, 0, 0, 0];
  constructor(tmcv: tmCv, arg: Partial<roundRect>) {
    super(tmcv, arg);
    this.radius = arg?.radius ?? this.radius;
  }
  draw(): this {
    if (!this.canvas.ctx) return this;
    let ctx = this.canvas.ctx;
    const x = this.x;
    const y = this.y;
    const width = this.width;
    const height = this.height;
    const fillStyle = this.fillStyle;
    const strokeStyle = this.strokeStyle;
    const lineWidth = this.lineWidth;
    const radius: [number, number, number, number] = this.radius;
    const topLeftRadius = radius[0];
    const topRightRadius = radius[1];
    const bottomLeftRadius = radius[3];
    const bottomRightRadius = radius[2];
    ctx.beginPath();
    ctx.moveTo(x + topLeftRadius, y);
    ctx.lineTo(x + width - topRightRadius, y);
    ctx.quadraticCurveTo(x + width, y, x + width, y + topRightRadius);
    ctx.lineTo(x + width, y + height - bottomRightRadius);
    ctx.quadraticCurveTo(
      x + width,
      y + height,
      x + width - bottomRightRadius,
      y + height
    );
    ctx.lineTo(x + bottomLeftRadius, y + height);
    ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeftRadius);
    ctx.lineTo(x, y + topLeftRadius);
    ctx.quadraticCurveTo(x, y, x + topLeftRadius, y);
    ctx.closePath();

    if (ctx.setFillStyle) {
      ctx.setFillStyle(fillStyle);
      ctx.setLineWidth(lineWidth);
      ctx.setStrokeStyle(strokeStyle);
    } else {
      ctx.fillStyle = fillStyle;
      ctx.lineWidth = lineWidth;
      ctx.strokeStyle = strokeStyle;
    }

    ctx.fill();
    ctx.stroke();
    return this;
  }
}
